#include<bits/stdc++.h>
using namespace std;
long long read()
{
    long long x=0;
    short f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
        {
            f*=(-1);
        }
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
void wit(long long x)
{
    if(x==0)
    {
        return ;
    }
    wit(x/10);
    putchar(x%10+'0');
    return ;
}
void write(long long x,bool edl)
{
    if(x<=0)
    {
        if(x==0)
        {
            putchar('0');
        }else{
            putchar('-');
            wit(x*(-1));
        }
    }else{
        wit(x);
    }
    if(edl)
    {
        putchar('\n');
    }else{
        putchar(' ');
    }
    return ;
}
void test(bool ext)
{
    puts("TEST");
    if(ext)
    {
        exit(0);
    }
    return ;
}
int transf(long double p,bool upf)
{
    int bas=int(p+0.5);
    if(abs(p-bas)<1e-10)
    {
        return bas;
    }
    if(upf)
    {
        return int(p)+1;
    }
    return int(p);
}
const int N=1e6+6;
int n,m,l,v,las[N],dp[N],nxt[N];
vector<pair<int,int> >pr;
map<int,int>sot;
map<int,int>::iterator it,it1,it2;
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int t,ans1=0,cnt;
    int di,vi,ai,pi,edger,posl,posr;
    long double pos,dis;
    bool overs;
    t=read();
    for(int t1=1;t1<=t;t1++)
    {
        n=read();
        m=read();
        l=read();
        v=read();
        ans1=0;
        pr.clear();
        sot.clear();
        for(int i=1;i<=n;i++)
        {
            di=read();
            vi=read();
            ai=read();
            if(ai==0)
            {
                if(vi<=v)
                {
                    continue;
                }
                pr.push_back(make_pair(di,l));
            }else{
                if(ai<0)
                {
                    ai*=(-1);
                    if(vi<=v)
                    {
                        continue;
                    }
                    dis=((long double)(vi*vi-v*v))/ai/2.0;
                    edger=transf(dis+di,true)-1;
                    pr.push_back(make_pair(di,min(edger,l)));
                }else{
                    if(vi>v)
                    {
                        pr.push_back(make_pair(di,l));
                        continue;
                    }
                    dis=((long double)(v*v-vi*vi))/ai/2.0;
                    edger=transf(dis+di,false)+1;
                    if(edger<=l)
                    {
                        pr.push_back(make_pair(edger,l));
                    }
                }
            }
        }
        for(int i=1;i<=m;i++)
        {
            pi=read();
            sot[pi]++;
        }
        cnt=0;
        for(it=sot.begin();it!=sot.end();it++)
        {
            cnt++;
            (*it).second=cnt;
        }
        for(int i=0;i<=cnt;i++)
        {
            las[i]=-1;
            nxt[i]=cnt+1;
            dp[i]=0;
        }
        for(int i=0;i<pr.size();i++)
        {
            overs=false;
            if(sot.find(pr[i].first)!=sot.end()||sot.find(pr[i].second)!=sot.end())
            {
                overs=true;
            }else{
                sot[pr[i].first]=0;
                it=sot.find(pr[i].first);
                it++;
                if(it!=sot.end()&&(*it).first<=pr[i].second)
                {
                    overs=true;
                }
                it--;
                sot.erase(it);
            }
            if(overs)
            {
                ans1++;
                if(sot.find(pr[i].first)!=sot.end())
                {
                    it1=sot.find(pr[i].first);
                }else{
                    sot[pr[i].first]=0;
                    it=sot.find(pr[i].first);
                    it++;
                    it1=it;
                    it--;
                    sot.erase(it);
                }
                if(sot.find(pr[i].second)!=sot.end())
                {
                    it2=sot.find(pr[i].second);
                }else{
                    sot[pr[i].second]=0;
                    it=sot.find(pr[i].second);
                    it--;
                    it2=it;
                    it++;
                    sot.erase(it);
                }
                las[(*it2).second]=max(las[(*it2).second],(*it1).second);
                nxt[(*it1).second]=min(nxt[(*it1).second],(*it2).second);
            }
        }
        posl=cnt+1;
        for(int i=cnt;i>=1;i--)
        {
            if(nxt[i]>=posl)
            {
                nxt[i]=cnt+1;
            }
            posl=min(posl,nxt[i]);
        }
        posl=0;
        for(int i=1;i<=cnt;i++)
        {
            if(las[i]<=posl)
            {
                las[i]=-1;
            }
            posl=max(posl,las[i]);
        }
        posl=1;
        posr=0;
        for(int i=1;i<=cnt;i++)
        {
            if(nxt[i]<=cnt)
            {
                dp[i]=min(dp[posr]+1,dp[i-1]+1);
            }else{
                dp[i]=min(dp[posr]+1,dp[i-1]);
            }
            if(las[i]>-1)
            {
                posr=i;
            }
        }
        write(ans1,false);
        write(m-dp[cnt],true);
    }
    return 0;
}
